Programming languages, for the most part, impose a synchronous view on an increasingly asynchronous world. In these languages, operations are totally ordered, so that, given a program's input data, the entire sequence of its computation is determined. However, for better or worse, computation is becoming increasingly asynchronous. At the lowest level, architectural innovation is increasingly focused on improving performance through increased concurrency, with approaches such as simultaneous multithreading or single-chip multiprocessors. Equally significantly, ubiquitous networks make collaboration among programs and users possible, but parallelism and communication introduce asynchrony.
Programming languages, despite the importance of asynchrony in reactive, event-driven, concurrent, or parallel applications, typically support asynchrony only through library mechanisms, such as threads, events, and synchronization, and provide no linguistic or error-checking features. Lack of support is a serious problem, as asynchrony makes the difficult task of programming even harder, since partially ordered behavior is harder to both understand and analyze and because nondeterminism obscures the cause of errors.
Thus what is needed is an improved asynchronous programming language, system or methodology that mitigates some of the aforementioned shortcomings of conventional languages.